Source for file phpgettext.includes.php

Documentation is available at phpgettext.includes.php

  1. <?php
  2. defined'_VALID_MOS' or die'Direct Access to this location is not allowed.' );
  3. /**
  4.  * function phpgettext()
  5.  *
  6.  * static function (we only need one phpgettext instance)
  7.  * loads a PHPGettext instance
  8.  * will detect if gettext is available and load compatibility file if it isn't
  9.  * 
  10.  */
  11.  
  12. {
  13.     var $name;
  14.     var $action;
  15.     var $view;
  16.  
  17.     function ActionHandler($name)
  18.     {
  19.         $this->name  = $name;
  20.         $this->action  = requestvar('action''_default');
  21.  
  22.         $views $this->name.'Views';
  23.  
  24.         if (class_exists($views)) {
  25.             $this->view = new $views($this);
  26.         else {
  27.             trigger_error("View class '$views' does not exist."E_USER_ERROR);
  28.         }
  29.     }
  30.  
  31.     function run()
  32.     {
  33.         $method $this->action;
  34.         /*
  35.         * do acl check here
  36.         */
  37.         if ($method && strlen($method&& method_exists($this$method))
  38.         return $this->$method();
  39.  
  40.         return false;
  41.     }
  42.  
  43.     function redirect($url)
  44.     {
  45.         if (headers_sent()) {
  46.             echo "<script>document.location.href='$url';</script>\n";
  47.         else {
  48.             while (@ob_end_clean())// clear output buffer
  49.             header"Location: $url);
  50.         }
  51.         exit;
  52.     }
  53.     function &container($reset false)
  54.     {
  55.         $name '__com_' $this->_name '_container';
  56.         if (!isset($_SESSION[$name]|| $reset{
  57.             $_SESSION[$namearray();
  58.         }
  59.         return $_SESSION[$name];
  60.     }
  61.  
  62. }
  63.  
  64. {
  65.     function _default(){
  66.         $this->view->_default();
  67.     }
  68.     function view(){
  69.         require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  70.  
  71.         $mode requestvar('mode');
  72.         $lang requestvar('lang');
  73.         $domain requestvar('domain');
  74.         $textdomain requestvar('textdomain');
  75.  
  76.         $catalog new PHPGettext_catalog($domain$textdomain);
  77.         $catalog->setproperty('mode'$mode);
  78.         $catalog->setproperty('lang'$lang);
  79.         $catalog->load();
  80.  
  81.         $renderer =renderer();
  82.         $renderer->addbyref('catalog'$catalog);
  83.         $renderer->addvar('mode'$mode);
  84.         $renderer->addvar('comments'$catalog->comments);
  85.         $renderer->addvar('headers'$catalog->headers);
  86.         $renderer->addvar('strings'$catalog->strings);
  87.  
  88.         switch ($mode)
  89.         {
  90.             case 'mo':
  91.             return $this->view->view();
  92.             break;
  93.             case 'po':
  94.             return $this->view->form();
  95.             break;
  96.             case 'pot':
  97.             return $this->view->view();
  98.             break;
  99.             default:
  100.             trigger_error(__CLASS__.'->'.__FUNCTION__.' - mode not recognized'E_USER_ERROR);
  101.             return false;
  102.             break;
  103.         }
  104.     }
  105.     function extract(){
  106.         require_once(dirname(__FILE__).'/phpgettext.catalog.php');        
  107.         $gettext =phpgettext();
  108.         $path _site_path_;
  109.         $args "--keyword=T_ --default-domain=phpgettext ";
  110.         $args .= '-o '.$path.'locale/phpgettext.pot ';
  111.         $args .= $path.'includes/*.php '.$path.'templates/*.php';
  112.         $gettext->xgettext($args);
  113.         $catalog new PHPGettext_catalog('phpgettext'$path.'locale/');
  114.         $catalog->setproperty('mode'_MODE_POT_);
  115.         $catalog->load();
  116.  
  117.         $renderer =renderer();
  118.         $renderer->addbyref('catalog'$catalog);        
  119.         $renderer->addvar('mode''pot');
  120.         $renderer->addvar('comments'$catalog->comments);
  121.         $renderer->addvar('headers'$catalog->headers);
  122.         $renderer->addvar('strings'$catalog->strings);
  123.         
  124.         return $this->view->view();
  125.     }
  126.     function cleartests(){
  127.         rmdirr('tests/locale/');
  128.         mkdir('tests/locale');
  129.         $this->redirect($_SERVER['PHP_SELF']);
  130.     }
  131.     
  132.     function delpot(){
  133.         $domain     requestvar('domain');
  134.         $textdomain requestvar('textdomain');
  135.         @unlink($textdomain.'/'.$domain.'.pot');
  136.         $this->redirect($_SERVER['PHP_SELF']);
  137.     }
  138.     function newfrompot(){
  139.         require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  140.         $locale     requestvar('locale');
  141.         $domain     requestvar('domain');
  142.         $textdomain requestvar('textdomain');
  143.         
  144.         $catalog =new PHPGettext_catalog($domain$textdomain);
  145.         $catalog->setproperty('mode'_MODE_POT_);
  146.         $catalog->load();
  147.         $catalog->setproperty('lang'$locale);
  148.         $catalog->setproperty('mode'_MODE_PO_);
  149.         $catalog->save();        
  150.         
  151.         $renderer =renderer();
  152.         $renderer->addbyref('catalog'$catalog);        
  153.         $renderer->addvar('mode'_MODE_PO_);
  154.         $renderer->addvar('comments'$catalog->comments);
  155.         $renderer->addvar('headers'$catalog->headers);
  156.         $renderer->addvar('strings'$catalog->strings);
  157.         
  158.         return $this->view->form();
  159.     }
  160.     function runtests(){
  161.         ob_start();
  162.         require_once('tests/simpletest/unit_tester.php');
  163.         require_once('tests/simpletest/reporter.php');        
  164.         require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  165.         /*
  166.         $test = &new GroupTest('PHPGettext tests');
  167.         $test->addTestFile('tests/gettext_test_cases.php');
  168.         $test->run(new HtmlReporter());
  169.         */
  170.         $test &new GroupTest('PHPGettext_Catalog tests');
  171.         $test->addTestFile('tests/catalog_test_cases.php');
  172.         $test->run(new HtmlReporter());
  173.         $contents ob_get_contents();
  174.         ob_end_clean();
  175.         $renderer =renderer();
  176.         $renderer->addvar('content'$contents);
  177.         $this->view->display();
  178.     }
  179.     function save(){
  180.         require_once(dirname(__FILE__).'/phpgettext.catalog.php');
  181.         $domain     trim(requestvar('domain'));
  182.         $textdomain trim(requestvar('textdomain'));
  183.         $lang       trim(requestvar('lang'));
  184.         $compile    trim(requestvar('compile'));
  185.         $comments   trim(requestvar('comments'));
  186.         $headers    requestvar('headers');
  187.         $msgstr     requestvar('msgstr');
  188.         $fuzzy      requestvar('is_fuzzy');
  189.  
  190.         $catalog =new PHPGettext_catalog($domain$textdomain$lang);
  191.         $catalog->setproperty('mode''po');
  192.         $catalog->setproperty('lang'$lang);
  193.         $catalog->load();
  194.  
  195.         if (isset($comments)) {
  196.             $comments explode("\n"$comments);
  197.             if (is_array($comments)) {
  198.                 foreach ($comments as $comment)   {
  199.                     if (strpos($comment'#'== 1)  {
  200.                         $catalog->comments .= $comment."\n";
  201.                     }
  202.                 }
  203.             }
  204.         }
  205.  
  206.         foreach ($headers as $key => $value{
  207.             $catalog->headers[$key$value;
  208.         }
  209.  
  210.  
  211.         foreach ($msgstr as $index => $string{
  212.             $catalog->strings[$index]->setmsgstr($string);
  213.             if (isset($is_fuzzy[$index])) {
  214.                 $catalog->strings[$index]->setfuzzy(true);
  215.             }
  216.         }
  217.         $catalog->save();
  218.         if ($compile 0{
  219.             $catalog->setproperty('mode''mo');
  220.             $catalog->save();
  221.         }
  222.         
  223.         $renderer =renderer();
  224.         $renderer->addbyref('catalog'$catalog);        
  225.         $renderer->addvar('mode'_MODE_MO_);
  226.         $renderer->addvar('comments'$catalog->comments);
  227.         $renderer->addvar('headers'$catalog->headers);
  228.         $renderer->addvar('strings'$catalog->strings);
  229.         
  230.         return $this->view->view();
  231.     }
  232. }
  233.  
  234. {
  235.     var $action;
  236.  
  237.     function phpgettextViews(&$action{
  238.         $this->action =$action;
  239.     }
  240.     function _default()
  241.     {
  242.         $renderer =renderer();
  243.         $renderer->addvar('content'$renderer->fetch('home.tpl.php'));
  244.         $this->display();
  245.     }
  246.  
  247.     function display({
  248.         $renderer =renderer();
  249.         $renderer->addbyref('view'$this);
  250.         $renderer->addbyref('t'phpgettext());
  251.         $renderer->display('main.tpl.php');
  252.     }
  253.  
  254.     function edit()
  255.     {
  256.         $renderer =Renderer::instance('php');
  257.         $renderer->display();
  258.     }
  259.  
  260.  
  261.     function view()
  262.     {
  263.         $renderer =renderer();
  264.         $renderer->addvar('content'$renderer->fetch('view.tpl.php'));
  265.         $this->display();
  266.     }
  267.  
  268.     function form()
  269.     {
  270.         $renderer =renderer();
  271.         $renderer->addvar('content'$renderer->fetch('form.tpl.php'));
  272.         $this->display();
  273.     }
  274.  
  275.  
  276.     function dtree($return false{
  277.         $textdomains $this->gettextdomains(rtrim($_SERVER['DOCUMENT_ROOT']'/'));
  278.         $dtree =  "<script language=\"javascript\" type=\"text/javascript\">\n";
  279.         $dtree .= "d = new dTree('d', '"._site_url_."img/');\n";
  280.         $dtree .= "d.add(0,-1,'Text Domains');\n";
  281.         $cnt 1;
  282.         foreach ($textdomains as $path{
  283.             $name str_replace($_SERVER['DOCUMENT_ROOT']""$path);
  284.             $name str_replace(_gettext_dirname_""$name);
  285.             $name rtrim(ucwords($name)'/');
  286.             if (strlen($name1{
  287.                 $name T_("Main");
  288.             }
  289.             $dtree .= "d.add($cnt,0,'$name ($path)');\n"// textdomains
  290.             $td $cnt;
  291.             $cnt++;
  292.  
  293.             $translations $this->getlanguages($path);
  294.  
  295.             if (is_array($translations)) {
  296.                 foreach ($translations as $lang => $files{
  297.                     $dtree .= "d.add($cnt,$td,'$lang');\n"// languages
  298.                     $lg $cnt;
  299.                     $cnt++;
  300.  
  301.                     if (is_array($files)) {
  302.                         foreach ($files as $file{
  303.                             if (is_array($file)) {
  304.                                 $dtree .= "d.add($cnt,$lg,'LC_MESSAGES');\n";
  305.                                 $mo $cnt;
  306.                                 $cnt++;
  307.                                 foreach ($file as $k => $v{
  308.                                     if (is_array($v)) {
  309.                                         foreach ($v as $f{
  310.                                             $dom substr($f0-3);
  311.                                             $dtree .= "d.add($cnt$mo, '$f', '".$_SERVER['PHP_SELF']."?action=view&mode=mo&lang=$lang&domain=$dom&textdomain=$path', '', '', '"._site_url_."img/square.gif');\n";
  312.                                             $cnt++;
  313.                                         }
  314.                                     }
  315.                                 }
  316.                             else {
  317.                                 $dom substr($file0-3);
  318.                                 $dtree .= "d.add($cnt,$lg,'$file', '".$_SERVER['PHP_SELF']."?action=view&mode=po&lang=$lang&domain=$dom&textdomain=$path', '', '', '"._site_url_."img/add_content.gif');\n";
  319.                                 $cnt++;
  320.                             }
  321.                         }
  322.                     }
  323.                 }
  324.             }
  325.  
  326.  
  327.             $templates $this->gettemplates($path);
  328.             for ($a=0$a<count($templates)$a++{
  329.                 $dom substr($templates[$a]0-4);
  330.                 $dtree .= "d.add($cnt,$td,'".$templates[$a]."', '".$_SERVER['PHP_SELF']."?action=view&mode=pot&domain=$dom&textdomain=$path');\n";
  331.                 $cnt++;
  332.             }
  333.  
  334.         }
  335.         $dtree .= "document.write(d);\n";
  336.         $dtree .= "</script>\n";
  337.         if ($return)
  338.         return $dtree;
  339.  
  340.         echo $dtree;
  341.     }
  342.     function gettextdomains($path){
  343.         static $domains;
  344.         if ($handle=@opendir($path)) {
  345.             while (($file readdir($handle)) !== false{
  346.                 if (is_dir("$path/$file"&& $file!= "." && $file!= ".."{
  347.                     if (preg_match('/^'._gettext_dirname_.'$/'$file)) {
  348.                         $domains["$path/$file";
  349.                     }
  350.                     $this->gettextdomains("$path/$file");
  351.                 }
  352.             }
  353.             closedir($handle);
  354.         else {
  355.             trigger_error(get_class($this)." File ( $path ) not found."E_USER_ERROR);
  356.         }
  357.         return isset($domains$domains array();
  358.     }
  359.  
  360.     function getlanguages($domain{
  361.         if ($handle opendir($domain)) {
  362.             while (false !== ($file readdir($handle))) {
  363.                 if (is_dir("$domain/$file"&& $file!= "." && $file!= "..")
  364.                 $langs[$file$this->gettranslations("$domain/$file");
  365.             }
  366.             closedir($handle);
  367.         }
  368.         return (isset($langs$langs array());
  369.     }
  370.  
  371.     function gettemplates($textdomain{
  372.         if ($handle=@opendir($textdomain)) {
  373.             while (($file readdir($handle)) !== false)
  374.             if (preg_match('/.pot$/'$file))
  375.             $templates[$file;
  376.             closedir($handle);
  377.         else {
  378.             trigger_error(get_class($this)." textdomain ( $path ) not found."E_USER_ERROR);
  379.         }
  380.         return isset($templates$templates array();
  381.     }
  382.  
  383.     function gettranslations($path{
  384.         $lang basename($path);
  385.         if (is_dir($path&& $handle=@opendir($path)) {
  386.             while (($file readdir($handle)) !== false{
  387.                 if ($file== "LC_MESSAGES"{
  388.                     $po[]['LC_MESSAGES'$this->getbinaries($path.'/LC_MESSAGES');
  389.                 elseif (preg_match('/.po$/'$file)) {
  390.                     $po[]$file;
  391.                 }
  392.             }
  393.             closedir($handle);
  394.         else {
  395.             trigger_error(get_class($this)." textdomain ( $path ) not found."E_USER_ERROR);
  396.         }
  397.         return isset($po$po array();
  398.     }
  399.  
  400.     function getbinaries($path{
  401.         if (is_dir($path&& $handle=@opendir($path)) {
  402.             while (($file readdir($handle)) !== false{
  403.                 if (preg_match('/.mo$/'$file)) {
  404.                     $mo[$file;
  405.                 }
  406.             }
  407.             closedir($handle);
  408.         else {
  409.             trigger_error(get_class($this)." textdomain ( $path ) not found."E_USER_ERROR);
  410.         }
  411.         return isset($mo$mo array();
  412.     }
  413.  
  414. }
  415.  
  416. class Renderer
  417. {
  418.  
  419.     var $dir;
  420.     var $vars = array();
  421.     var $engine = 'php';
  422.     var $template = '';
  423.  
  424.     function Renderer(){}
  425.  
  426.     function display($template$return false){
  427.         if ($template == NULL){
  428.             $error 'A template has not been specified';
  429.             trigger_error($errorE_USER_ERROR);
  430.             return false;
  431.         }
  432.         $this->template = $this->dir . $template;
  433.  
  434.         if (is_readable($this->template)) {
  435.             extract($this->getvars());
  436.             if ($return{
  437.                 ob_start();
  438.                 include_once($this->template);
  439.                 $ret ob_get_contents();
  440.                 ob_end_clean();
  441.                 return $ret;
  442.             else {
  443.                 include_once($this->template);
  444.             }
  445.         else {
  446.             $error 'Template file ' $template ' does ' 'not exist or is not readable';
  447.             trigger_error($errorE_USER_ERROR);
  448.             return false;
  449.         }
  450.         return false;
  451.     }
  452.  
  453.     function fetch($template){
  454.         return $this->display($templatetrue);
  455.     }
  456.     function &getengine(){
  457.         return $this->engine;
  458.     }
  459.     function addvar($key$value){
  460.         $this->vars[$key$value;
  461.     }
  462.     function addbyref ($key&$value{
  463.         $this->vars[$key=$value;
  464.     }
  465.     function getvars($name false){
  466.         return (isset($this->vars[$name])) $this->vars[$name$this->vars;
  467.     }
  468.  
  469.     function setdir($dir){
  470.         $this->dir = (substr($dir-1== DIRECTORY_SEPARATOR$dir $dir.DIRECTORY_SEPARATOR;
  471.     }
  472.     function getdir(){
  473.         return $this->dir;
  474.     }
  475.     function template($template){
  476.         $this->template = $template;
  477.     }
  478. }
  479.  
  480.  
  481.  
  482.  
  483. // cleans out a directory recursively
  484. function rmdirr($dir{
  485.     if($objs glob($dir."/*")){
  486.         foreach($objs as $obj{
  487.             is_dir($obj)rmdirr($objunlink($obj);
  488.         }
  489.     }
  490.     rmdir($dir);
  491. }
  492.  
  493.  
  494.  
  495.  
  496. function &renderer($engine 'php'{
  497.     static $renderer;
  498.     if (is_null($renderer[$engine])) {
  499.         if ($engine == 'php'{
  500.             $renderer[$enginenew Renderer();
  501.         else {
  502.             $classname $engine 'Renderer';
  503.             if (class_exists($classname))
  504.             $renderer[$enginenew $classname();
  505.         }
  506.     }
  507.     return $renderer[$engine];
  508. }
  509.  
  510.  
  511. function dump($var{
  512.     $trace debug_backtrace();
  513.     echo "<div>dump() in {$trace[0]['file']}:{$trace[0]['line']}</div>";
  514.     include_once 'Var_Dump.php';
  515.     if (class_exists('Var_Dump')) {
  516.         Var_Dump::displayInit(array('display_mode'=>'HTML4_Table'));
  517.         Var_Dump::display($var);
  518.     else {
  519.         echo "<pre>";
  520.         var_dump($var);
  521.         echo "</pre>";
  522.     }
  523. }
  524.  
  525. function error_handler($errno$errmsg$filename$linenum{
  526.  
  527.     $dt date("Y-m-d H:i:s (T)");
  528.     $errortype array (
  529.     E_ERROR           => "Error",
  530.     E_WARNING         => "Warning",
  531.     E_PARSE           => "Parse Error",
  532.     E_NOTICE          => "Notice",
  533.     E_CORE_ERROR      => "Core Error",
  534.     E_CORE_WARNING    => "Core Warning",
  535.     E_COMPILE_ERROR   => "Compile Error",
  536.     E_COMPILE_WARNING => "Compile Warning",
  537.     E_USER_ERROR      => "User Error",
  538.     E_USER_WARNING    => "User Warning",
  539.     E_USER_NOTICE     => "User Notice"
  540.     );
  541.  
  542.     // set of errors for which a var trace will be saved
  543.     //$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
  544.  
  545.     $output = <<<EOT
  546. <style type="text/css">
  547. <!-- 
  548.     .red_bold {color:red; font-weight:bold;}
  549.     .error { border: 1px solid grey; color: #000000;}
  550.     .error p.errmsg { font-size: 1em;  background-color: #990033; color: white; margin: 0 0 0 0;}
  551.     .error p.errfile { font-size: .8em; font-style: italic; margin: 0 0 0 20px;}
  552.     .error table.backtrace { }
  553.     .error table.backtrace th { text-align: left; background-color: #339900; color: white}
  554.     .error table.backtrace td {  color: #000000; background-color: #E8E8E8;}
  555.     .error table.backtrace span.function { font-weight: bold; }
  556.     .error table.backtrace span.file { font-size: .8em; font-style: italic; }
  557.     .error table.backtrace span.args { color: #000000; }
  558. -->
  559. </style>
  560. EOT;
  561.     $output .= "<div class=\"error\">";
  562.     $output .= "<p class=\"errmsg\">$errortype[$errno] : $errmsg</p>\n";
  563.     $output .= "<p class=\"errfile\">in file $filename : $linenum</p>\n";
  564.     $output .=  backtrace();
  565.     $output .= "</div>";
  566.     echo $output;
  567.     // save to the error log, and e-mail it if there is a critical user error
  568.     /*
  569.     error_log($err, 3, "/error.log");
  570.     if ($errno == E_USER_ERROR) {
  571.     mail("phpdev@example.com", "Critical User Error", $err);
  572.     }
  573.     */
  574. }
  575.  
  576. function backtrace(){
  577.     $backtrace debug_backtrace();
  578.     $output "<table class=\"backtrace\"  border=\"1\" cellpadding=\"0\" cellspacing=\"0\">";
  579.     $output .= "<tr><th>#</th><th>function / location</th><th>args</th></tr>";
  580.     $count 0;
  581.     if (isset($backtrace[0]['line'])) {
  582.         foreach ($backtrace as $bt{
  583.             $argstr '';
  584.             $class = isset($bt['class']$bt['class''';
  585.             $type = isset($bt['type']$bt['type''';
  586.             $function = isset($bt['function']$bt['function''';
  587.             $file = isset($bt['file']$bt['file''';
  588.             $line = isset($bt['line']$bt['line''';
  589.             $args = isset($bt['args']$bt['args'array();
  590.             foreach ($args as $a{
  591.                 if (!empty($args)) {
  592.                     $argstr .= ', ';
  593.                 }
  594.                 switch (gettype($a)) {
  595.                     case 'integer':
  596.                     case 'double':
  597.                     $argstr .= $a;
  598.                     break;
  599.                     case 'string':
  600.                     $a htmlspecialchars($a);
  601.                     $argstr .= "\"$a\"";
  602.                     break;
  603.                     case 'array':
  604.                     $argstr .= 'Array('.count($a).')';
  605.                     break;
  606.                     case 'object':
  607.                     $argstr .= 'Object('.get_class($a).')';
  608.                     break;
  609.                     case 'resource':
  610.                     $argstr .= 'Resource('.strstr($a'#').')';
  611.                     break;
  612.                     case 'boolean':
  613.                     $argstr .= $a 'True' 'False';
  614.                     break;
  615.                     case 'NULL':
  616.                     $argstr .= 'Null';
  617.                     break;
  618.                     default:
  619.                     $argstr .= 'Unknown';
  620.                 }
  621.             }
  622.             if ($count 1{
  623.                 $output .= "<tr>\n";
  624.                 $output .= "<td><span>".($count-1)."</span></td>\n";
  625.                 $output .= "<td><span class=\"function\">{$class}{$type}{$function}()</span><br />\n";
  626.                 $output .= "<span class=\"file\">{$file}:{$line}</span></td>\n";
  627.                 $output .= "<td><span class=\"args\">$argstr<br /></span></td>\n";
  628.                 $output .= "</tr>\n";
  629.             }
  630.             $count++;
  631.         }
  632.     }
  633.     $output .= "</table>\n";
  634.     return $output;
  635. }
  636.  
  637. ?>

Documentation generated on Mon, 05 May 2008 16:22:29 +0400 by phpDocumentor 1.4.0